/* 
 * File:   NodoArbolB_DNI.h
 * Author: mari
 *
 * Created on 5 de septiembre de 2010, 1:27
 * NodoArbolB_DNI<unsigned orden> representa a los nodos de un Arbol B de orden
 * para un sistema de ficheros que utiliza el DNI como clave primaria
 */

#ifndef NODOARBOLB_DNI_H
#define	NODOARBOLB_DNI_H
#include <map>
#include <iostream>

using namespace std;
typedef struct{

}TipoDni;

class NodoArbolB_DNI{
    map<TipoDni,long> nodo;
    unsigned int orden;

public:
    NodoArbolB_DNI();
    NodoArbolB_DNI(unsigned ordn):nodo(){orden=ordn;}
    NodoArbolB_DNI(const NodoArbolB_DNI& orig);
    bool insertar(TipoDni clave,unsigned long posicion);
    bool eliminar(TipoDni clave);
    void Dividir(NodoArbolB_DNI &cnodo);
    void unir(NodoArbolB_DNI &cnodo);
    void redistribuir(NodoArbolB_DNI &cnodo);

    ~NodoArbolB_DNI();



};
bool NodoArbolB_DNI::insertar(TipoDni clave,unsigned long posicion){

    pair<TipoDni,long> pnodo;
    pair<map<TipoDni,long>::iterator,bool>ret;
    pnodo.first=clave;
    pnodo.second=posicion;
    
    //Falla
    //ret=nodo.insert(pnodo);

    if(ret.second==false){return false;}
    else return true;
}
bool NodoArbolB_DNI::eliminar(TipoDni clave){
    map<TipoDni,long>::iterator inodo;
    /*
     * inodo=nodo.find(clave);
     * if(inodo==nodo.end()){return false;}
     * else{
     *      nodo.erase(clave);
     *      return true;
     */
}

void NodoArbolB_DNI::Dividir(NodoArbolB_DNI &cnodo){
    map<TipoDni,long>::iterator inodo =nodo.begin();
    int tam=nodo.size();

    for(int i=0;i<tam/2;i++){
        long posi=(*inodo).second;
        TipoDni dni=(*inodo).first;
        eliminar(dni);
        cnodo.insertar(dni,posi);
        inodo=nodo.begin();
    }

}

void NodoArbolB_DNI::unir(NodoArbolB_DNI &cnodo){
    map<TipoDni,long>::iterator inodo=cnodo.nodo.begin();
    int tam=cnodo.nodo.size();

    for(int i=0;i<tam;i++){
        TipoDni dni=(*inodo).first;
        long pos=(*inodo).second;
        cnodo.eliminar(dni);
        insertar(dni,pos);
        nodo=cnodo.nodo.begin();
    }
}

void NodoArbolB_DNI::redistribuir(NodoArbolB_DNI &cnodo){

    map<TipoDni,long> mapa;
    map<TipoDni,long>::iterator inodos;

    for(inodos=nodo.begin();inodos!=nodo.end();inodos++){
        pair<TipoDni,long> pmapa;
        pmapa.first=(*inodos).first;
        pmapa.second=(*inodos).second;
        mapa.insert(pmapa);
    }

    for(inodos=cnodo.nodo.begin();inodos!=cnodo.nodo.end();inodos++){
        pair<TipoDni,long> pmapa;
        pmapa.first=(*inodos).first;
        pmapa.second=(*inodos).second;
        mapa.insert(pmapa);
    }

    nodo.clear();
    cnodo.nodo.clear();

    int tam=mapa.size();
    inodos=mapa.begin();

    for(int i=0;i<tam/2;i++){
        TipoDni dni=(*inodos).first;
        long pos=(*inodos).second;
        inodos++;
        insertar(dni,pos);
    }

    for(int i=tam/2;i<tam;i++){
        TipoDni dni=(*inodos).first;
        long pos=(*inodos).second;
        inodos++;
        cnodo.insertar(dni,pos);
    }
}
#endif	/* NODOARBOLB_DNI_H */

